<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>矩匹配 | 阿力木·达依木|Alimu Dayimu</title>
    <link rel="stylesheet" href="https://alim.gitee.io/css/style.css" />
    <link rel="stylesheet" href="https://alim.gitee.io/css/fonts.css" />
    
<link href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.6.0/build/styles/github.min.css" rel="stylesheet">


    


<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" integrity="sha384-Xi8rHCmBmhbuyyhbI88391ZKP2dmfnOl4rT9ZfRI7mLTdk1wblIUnrIq35nqwEvC" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js" integrity="sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"></script>
<script>
    document.addEventListener("DOMContentLoaded", function() {
        renderMathInElement(document.body, {
          
          
          delimiters: [
          {left: "$$", right: "$$", display: true},
          {left: "$", right: "$", display: false},
          {left: "\\(", right: "\\)", display: false},
          {left: "\\[", right: "\\]", display: true},
          {left: "\\begin{equation}", right: "\\end{equation}", display: true},
          {left: "\\begin{align}", right: "\\end{align}", display: true},
          {left: "\\begin{alignat}", right: "\\end{alignat}", display: true},
          {left: "\\begin{gather}", right: "\\end{gather}", display: true},
          {left: "\\begin{CD}", right: "\\end{CD}", display: true},
          {left: "\\[", right: "\\]", display: true}
          ],
          
          throwOnError : false
        });
    });
</script>


  </head>

  <body>
    <nav>
    <ul class="menu">
      
      <li><a href="https://alim.gitee.io/">Home</a></li>
      
      <li><a href="https://alim.gitee.io/post/">Post</a></li>
      
      <li><a href="https://alim.gitee.io/talks/">Talks</a></li>
      
      <li><a href="https://alim.gitee.io/about/">About</a></li>
      
    </ul>
    <hr/>
    </nav>

<div class="article-meta">
<h1 class="title">矩匹配</h1>
<div class="meta">
<span class="author">Alimu Dayimu</span>
<span class="date middot">2022/06/29</span>

<span class="reading-time middot"> 1 min read </span>
<div class="terms">
  
  
  
  
  
</div>
</div>
</div>




<main>
<p>没有接触过数理统计的基本上很少知道矩（moment），认知基本上都停留在正态分布中。正态分布需要用均值和方差来描述，这两个参数也被成为位置参数（location parameters）和尺度参数（scale parameter），同时两者刚好是正态分布的一阶矩和二阶矩。包括对于正态分布、多元正态分布（multivariate normal）和泊松分布（Poisson）来说，分布的方差是关于均值的函数。但是对于二项分布（binomial）、多项分布（multinomial）、负二项分布（negative binomial）、贝塔分布（beta）、伽马分布（gmma）、对数正态分布（lognormal）、指数分布（exponential）和狄利克雷分布（Dirichlet distribution）的参数是均值和方差的函数。简单一点就是均值和方差随着分布的参数改变而改变，而这些分布多数是用尺度参数（scale parameter）和/或位置参数（location parameter）等等去描述。在不知道分布的参数时，我们可以用这些矩与参数之间的对应关系，将矩映射到参数上，得到我们想要的分布的参数。假设$\alpha$和$\beta$是某一分布的两个参数：
$$\alpha = f_1(\mu, \sigma^2)$$
$$\beta = f_2(\mu, \sigma^2)$$</p>
<p>以Gamma分布为例：
$$f(x;\alpha,\beta) = \frac{x^{\alpha - 1}e^{-\beta x}\beta^\alpha} {\Gamma(\alpha)} $$
该分布的均值和方差为
$$\mu=\frac{\alpha}{\beta}$$
$$\sigma^2=\frac{\alpha}{\beta^2}$$
刚好我们可以由上面的式子确定Gamma分布的两个参数。</p>
<p>这个有什么用呢？我们举一个例子。假设有一个研究是用AI根据医学影像预测肿瘤的大小，然后拿这个结果跟专业的影像师勾画的结果进行比较，比较的时候一般影响区域会被划分成小的方块，然后看这个AI的灵敏度，灵敏度的范围在0到1。研究者想研究哪些因素影响这个灵敏度，于是找到了作为医学统计师的你。你当然可以简单粗暴的使用普通线性模型，即假设这个灵敏度服从正态分布。但是作为认真负责你，知道正态分布不行，因为正态分布的取值范围包括小于0和大于1的其他实数，所以打算考虑fractional logit模型或者是Beta分布，前者在<code>glm</code>模型中将连接函数改成<code>family=quasibinomial(logit)</code>。考虑到这个灵敏度不包括0和1（Beta分布不包括0和1），你为了显得自己很高深决定用Beta分布。在与研究者商量以后，你们确定了你纳入的变量，于是有了下面的模型
$$\bar{y}=\beta_0+\bf\beta X$$
上面的只是一个线性部分，你需要将其$\bar{y}$映射到Beta分布。Beta分布的分布函数是：
$$f(x;\alpha,\beta)={\large\frac{1}{B(\alpha,\beta)}}x^{\alpha-1}(1-x)^{\beta-1}$$
其均值和方差分别是：
$$\mu = \frac{\alpha}{\alpha+\beta}$$
$$\sigma^2 = \frac{\alpha\beta}{(\alpha+\beta)^2 (\alpha+\beta+1)}$$</p>
<p>通过上面的均值和方差很容易就就能得到Beta分布的两个参数：
$$\alpha=\left(\frac{1-\mu}{\sigma^2}-\frac{1}{\mu}\right)\mu^2$$
$$\beta=\alpha\left(\frac{1}{\mu}-1\right)$$
均值和方差可以用之前的线性部分$\bar{y}$得到，然后再利用上面的结果将其转换成Beta分布：
$$y\sim\mathcal{B}(\alpha,\beta)$$</p>
<p>R计算代码</p>
<pre><code class="language-r">est_beta_param &lt;- function(mu, var) {
  alpha &lt;- ((1 - mu) / var - 1 / mu) * mu ^ 2
  beta &lt;- alpha * (1 / mu - 1)
  return(list(alpha = alpha, beta = beta))
}
</code></pre>
<p>如果我们要拟合这个Beta回归可以用下面的Jags代码进行拟合，注意这里面的采用的是参数化的方法（parameterization），而且这里可能会有人怀疑为什么不直接用上面的公式？很简单，因为这个计算的是个体的一个值，一个值没有方差。</p>
<pre><code class="language-r">for(i in 1:n) {
  # Likelihood
  y[i] ~ dbeta(alpha[i], beta[i])
  alpha[i] &lt;- mu[i] * phi
  beta[i]  &lt;- (1-mu[i]) * phi
  logit(mu[i]) &lt;- a + b*x[i]
}
# Priors
phi ~ dgamma(.1,.1)
a ~ dnorm(0,.001)
b ~ dnorm(0,.001)
</code></pre>
<p>对于对数正态分布，我们通常使用中位数来做矩匹配，即假设$\mu$在这里是中位数，那么对数正态分布可表示为：
$$y\sim lognormal(log(\mu), \sigma_{log}^2)$$</p>
<h2 id="后记">后记</h2>
<p>这个虽然是一个简单的示例，但是通过这个例子我们可以知道的是</p>
<ul>
<li>选用的模型要符合数据的分布，不能简单粗暴的使用假设正态分布的普通线性模型，如有需要对数据做变换，或使用广义线性模型。</li>
<li>在贝叶斯分析中，当我们使用其他的模型或者是数据得到了后验分布以后，我们想在新的模型和数据中使用这个之前得到的后验分布，但是两个数据不能简单地合并时，可以用这个方法利用之前得到的后验分布去求对应先验分布的参数。</li>
</ul>

</main>


  <footer>
  <script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.6.0/build/highlight.min.js"></script>
<script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.6.0/build/languages/r.min.js"></script>

<script>
hljs.configure({languages: []});
hljs.initHighlightingOnLoad();
</script>

  
  <hr/>
  © <a href="https://alim.gitee.io/">Alimu Dayimu</a> 2021 - 2022 | <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">BY-NC-ND 4.0</a> | <a href="https://github.com/adayim">GitHub</a> | <a href="https://gitee.com/alim">gitee</a> | <a href="https://alim.gitee.io/index.xml">RSS</a>
  
  
  </footer>
  </body>
</html>
